این جلسه یکی از مباحث کلیدی در امنیت دادهها است. رمزنگاری فایلها با gpg در آزمونهای LPIC و RHCSA بسیار پرتکرار است.
🔒 قبل از شروع، یه مثال ساده:
فرض کن میخوای یه نامهٔ محرمانه برای دوستت بفرستی، اما نمیخوای هیچ کس دیگهای بتونه بخونش. نامه رو توی یه صندوق قفلشده میذاری و فقط اون شخص کلید داره. توی لینوکس، GPG دقیقاً همینه: یه ابزار قدرتمند برای رمزنگاری فایلها و امضای دیجیتال که بهت اجازه میده دادههات رو از دید دیگران مخفی کنی. این جلسه بهت یاد میده چطور با gpg کار کنی!
▍ GPG چیست؟
GPG (مخفف GNU Privacy Guard) یک پیادهسازی آزاد و متنباز از استاندارد OpenPGP است. از آن برای:
- رمزنگاری و رمزگشایی فایلها.
- امضای دیجیتال اسناد.
- مدیریت کلیدها (تولید، صادرات، واردات).
- ارتباط امن از طریق ایمیل.
🔑 نکته کلیدی: GPG از رمزنگاری نامتقارن (Public/Private Key) استفاده میکند. شما یک کلید عمومی برای رمزنگاری و یک کلید خصوصی برای رمزگشایی دارید.
▍ ساختار دایرکتوری GPG
کلیدهای GPG در دایرکتوری ~/.gnupg/ ذخیره میشوند. ساختار آن:
┌──(ya3in㉿kali)-[~]
└─$ ls ~/.gnupg/
common.conf openpgp-revocs.d private-keys-v1.d public-keys.d trustdb.gpg
توضیح:
private-keys-v1.d → کلیدهای خصوصی.
public-keys.d → کلیدهای عمومی وارداتی.
trustdb.gpg → پایگاه داده اعتماد.
▍ مرحله ۱: تولید کلید GPG
برای شروع باید یک جفتکلید (عمومی و خصوصی) تولید کنید.
┌──(ya3in㉿kali)-[~]
└─$ gpg --full-generate-key
gpg (GnuPG) 2.2.40; Copyright (C) 2022 g10 Code GmbH
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
1 = key expires in n days
5 = key expires in n weeks
6 = key expires in n months
7 = key expires in n years
Key is valid for? (0) 0
Real name: Ya3in User
Email address: ya3in@example.com
Comment: My GPG Key
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Enter passphrase: (یک رمز قوی وارد کنید)
Repeat passphrase: (دوباره وارد کنید)
نکته: gpg --full-generate-key یک کلید کامل با تنظیمات دقیق تولید میکند. اندازهٔ کلید ۴۰۹۶ بیت امنترین گزینه است.
• مشاهدهٔ کلیدهای ساختهشده
┌──(ya3in㉿kali)-[~]
└─$ gpg --list-keys
/home/ya3in/.gnupg/pubring.kbx
--------------------------------
pub rsa4096 2026-09-07 [SC]
ABCDEF1234567890ABCDEF1234567890ABCDEF
uid [ultimate] Ya3in User (My GPG Key) <ya3in@example.com>
sub rsa4096 2026-09-07 [E]
▍ مرحله ۲: صادرات کلید عمومی
برای اینکه دیگران بتوانند برای شما پیام رمزنگاریشده بفرستند، باید کلید عمومی خود را در اختیار آنها بگذارید.
• صادرات به صورت باینری
┌──(ya3in㉿kali)-[~]
└─$ gpg --export ya3in@example.com > public.key
• صادرات به صورت متنی (ASCII Armor)
┌──(ya3in㉿kali)-[~]
└─$ gpg --armor --export ya3in@example.com > public.key
└─$ cat public.key
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGW...
... (رشته طولانی)
-----END PGP PUBLIC KEY BLOCK-----
توضیح: گزینهٔ --armor کلید را به صورت متن قابل خواندن (ASCII) صادر میکند که برای ایمیل و اشتراکگذاری در وب مناسبتر است.
نکته: کلید عمومی را میتوانید با خیال راحت به اشتراک بگذارید. کلید خصوصی هرگز نباید در اختیار کسی قرار گیرد.
▍ مرحله ۳: واردات کلید عمومی دیگران
برای اینکه بتوانید برای کسی فایل رمزنگاریشده بفرستید، باید کلید عمومی او را وارد کنید.
┌──(ya3in㉿kali)-[~]
└─$ gpg --import public.key
gpg: key ABCDEF1234567890: public key "UserB (Test Key) <userb@example.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
└─$ gpg --list-keys
/home/ya3in/.gnupg/pubring.kbx
--------------------------------
pub rsa4096 2026-09-07 [SC]
ABCDEF1234567890ABCDEF1234567890ABCDEF
uid [ unknown] UserB (Test Key) <userb@example.com>
sub rsa4096 2026-09-07 [E]
💡 نکته: بعد از واردات، کلید به عنوان [ unknown ] نشان داده میشود. برای تأیید هویت، میتوانید آن را امضا کنید (Sign).
▍ مرحله ۴: رمزنگاری فایل با کلید عمومی
حالا میتوانید یک فایل را با کلید عمومی گیرنده رمزنگاری کنید.
┌──(ya3in㉿kali)-[~]
└─$ echo "LPIC1 GPG Public Key Test" > secret.txt
└─$ gpg -e -r userb@example.com secret.txt
gpg: checking the trustdb
gpg: using "userb@example.com" as default secret key
gpg: This key belongs to us
gpg: There is no assurance this key really belongs to the named user
gpg: It is NOT certain that the key belongs to its owner.
If you *really* know what you are doing, you may answer the next question with yes.
Use this key anyway? (y/N) y
gpg: secret.txt encrypted
└─$ ls
secret.txt secret.txt.gpg
توضیح:
-e → رمزنگاری (Encrypt).
-r userb@example.com → گیرندهٔ فایل (باید کلید عمومی او را داشته باشید).
- خروجی فایل
secret.txt.gpg است.
نکته: فقط گیرنده (صاحب کلید خصوصی) میتواند فایل را رمزگشایی کند.
▍ مرحله ۵: انتقال فایل رمزنگاریشده
فایل رمزنگاریشده را میتوانید از طریق هر روشی (ایمیل، scp، USB، ...) به گیرنده منتقل کنید.
┌──(ya3in㉿kali)-[~]
└─$ scp secret.txt.gpg userb@192.168.1.100:/home/userb/
▍ مرحله ۶: رمزگشایی فایل (در سمت گیرنده)
گیرنده با کلید خصوصی خود و Passphrase میتواند فایل را رمزگشایی کند.
┌──(userb㉿server)-[~]
└─$ gpg -d secret.txt.gpg
gpg: encrypted with RSA key, ID ABCDEF1234567890
gpg: public key is ABCDEF1234567890
gpg: using "userb@example.com" as default secret key
Enter passphrase: (رمز کلید خصوصی را وارد کنید)
gpg: encrypted with 4096-bit RSA key, ID ABCDEF1234567890
LPIC1 GPG Public Key Test
توضیح: -d یعنی Decrypt (رمزگشایی). محتوای فایل اصلی نمایش داده میشود.
• ذخیرهٔ خروجی رمزگشاییشده در فایل
┌──(userb㉿server)-[~]
└─$ gpg -d secret.txt.gpg > secret.txt
└─$ cat secret.txt
LPIC1 GPG Public Key Test
▍ نصب pinentry برای وارد کردن Passphrase
pinentry یک برنامهٔ کمکی است که یک پنجرهٔ گرافیکی یا متنی برای وارد کردن Passphrase نمایش میدهد.
┌──(ya3in㉿kali)-[~]
└─$ sudo dnf install pinentry
# در Red Hat / Fedora
└─$ sudo apt install pinentry-curses
# در Debian / Ubuntu
نکته: اگر هنگام رمزگشایی خطای مربوط به pinentry دیدید، آن را نصب کنید تا Passphrase را به راحتی وارد کنید.
▍ جدول خلاصه دستورات GPG
| دستور |
کاربرد |
gpg --full-generate-key |
تولید جفتکلید جدید |
gpg --list-keys |
نمایش کلیدهای عمومی موجود |
gpg --list-secret-keys |
نمایش کلیدهای خصوصی موجود |
gpg --export user@example.com > public.key |
صادرات کلید عمومی (باینری) |
gpg --armor --export user@example.com > public.key |
صادرات کلید عمومی (متنی) |
gpg --import public.key |
واردات کلید عمومی دیگران |
gpg -e -r user@example.com file.txt |
رمزنگاری فایل برای گیرنده |
gpg -d file.txt.gpg |
رمزگشایی فایل |
gpg -d file.txt.gpg > file.txt |
رمزگشایی و ذخیره در فایل |
gpg --delete-key user@example.com |
حذف کلید عمومی |
gpg --delete-secret-key user@example.com |
حذف کلید خصوصی |
▍ سناریوی کامل (بر اساس تصویر)
📝 سناریوی عملی از تصویر:
فرض کنید دو هاست A و B داریم. کاربر A میخواهد یک فایل را برای کاربر B رمزنگاری کند و بفرستد.
# ====== هاست B (گیرنده) ======
# ۱. تولید کلید
gpg --full-generate-key
# ۲. صادرات کلید عمومی
gpg --armor --export userb@example.com > public.key
# ۳. ارسال public.key به هاست A
scp public.key usera@192.168.1.50:/home/usera/
# ====== هاست A (فرستنده) ======
# ۴. واردات کلید عمومی B
gpg --import public.key
# ۵. ساخت فایل و رمزنگاری
echo "LPIC1 GPG Public Key Test" > secret.txt
gpg -e -r userb@example.com secret.txt
# ۶. ارسال فایل رمزنگاریشده به B
scp secret.txt.gpg userb@192.168.1.100:/home/userb/
# ====== هاست B (گیرنده) ======
# ۷. رمزگشایی فایل
gpg -d secret.txt.gpg
# خروجی: LPIC1 GPG Public Key Test
⚠️ نکات مهم:
- هرگز کلید خصوصی خود را با کسی به اشتراک نگذارید.
- برای کلید خصوصی حتماً Passphrase قوی انتخاب کنید.
- کلید عمومی را میتوانید با خیال راحت منتشر کنید.
- برای تأیید هویت گیرنده، کلید عمومی او را از منبع معتبر دریافت کنید.
✅ جمعبندی نهایی:
- GPG → ابزار رمزنگاری فایلها و امضای دیجیتال.
gpg --full-generate-key → تولید جفتکلید.
gpg --export → صادرات کلید عمومی.
gpg --import → واردات کلید عمومی دیگران.
gpg -e -r → رمزنگاری فایل برای گیرنده خاص.
gpg -d → رمزگشایی فایل.
--armor → تبدیل کلید به فرمت متنی (ASCII).
📝 تمرین پیشنهادی:
یک سناریوی کامل پیادهسازی کنید:
- یک جفتکلید GPG با
gpg --full-generate-key بسازید.
- کلید عمومی خود را با
--armor --export صادر کنید.
- یک فایل متنی ساده بسازید و با
gpg -e -r برای خودتان (یا یک دوست) رمزنگاری کنید.
- فایل را با
gpg -d رمزگشایی کنید.
- کلید عمومی یک دوست را وارد کنید و برای او فایل رمزنگاریشده بفرستید.